/**
 * @module olcs.AutoRenderLoop
 */
class AutoRenderLoop {
    /**
     * @constructor
     * @param {olcs.OLCesium} ol3d
     */
    constructor(ol3d) {
        this.ol3d = ol3d;
        this.scene_ = ol3d.getCesiumScene();
        this.canvas_ = this.scene_.canvas;
        this._boundNotifyRepaintRequired = this.notifyRepaintRequired.bind(this);
        this.repaintEventNames_ = [
            'mousemove', 'mousedown', 'mouseup',
            'touchstart', 'touchend', 'touchmove',
            'pointerdown', 'pointerup', 'pointermove',
            'wheel'
        ];
        this.enable();
    }
    /**
     * Enable.
     */
    enable() {
        this.scene_.requestRenderMode = true;
        this.scene_.maximumRenderTimeChange = 1000;
        for (const repaintKey of this.repaintEventNames_) {
            this.canvas_.addEventListener(repaintKey, this._boundNotifyRepaintRequired, false);
        }
        window.addEventListener('resize', this._boundNotifyRepaintRequired, false);
        // Listen for changes on the layer group
        this.ol3d.getOlMap().getLayerGroup().on('change', this._boundNotifyRepaintRequired);
    }
    /**
     * Disable.
     */
    disable() {
        for (const repaintKey of this.repaintEventNames_) {
            this.canvas_.removeEventListener(repaintKey, this._boundNotifyRepaintRequired, false);
        }
        window.removeEventListener('resize', this._boundNotifyRepaintRequired, false);
        this.ol3d.getOlMap().getLayerGroup().un('change', this._boundNotifyRepaintRequired);
        this.scene_.requestRenderMode = false;
    }
    /**
     * Restart render loop.
     * Force a restart of the render loop.
     * @api
     */
    restartRenderLoop() {
        this.notifyRepaintRequired();
    }
    notifyRepaintRequired() {
        this.scene_.requestRender();
    }
}
export default AutoRenderLoop;
